package cz.cvut.manatee.processManager;

import java.util.Random;
import java.util.Date;

public class Test {

	static ProcessManager procesManager = null;
	
	protected static class FakeRMI implements Runnable {

		static volatile int pocet_rmi = 0;
		
		protected final int pocet_korpusu;
		protected final int pocet_cql;
		protected final int pocet_typu_dotazu;
		protected int pocet_cyklu_rmi;
		protected final int max_cekaci_doba;
		
		public FakeRMI(int pocet_cyklu_rmi, int pocet_korpusu, int pocet_cql, int pocet_typu_dotazu, int max_cekaci_doba){
			this.pocet_korpusu = pocet_korpusu;
			this.pocet_cql = pocet_cql;
			this.pocet_typu_dotazu = pocet_typu_dotazu;
			this.pocet_cyklu_rmi = pocet_cyklu_rmi;
			this.max_cekaci_doba = max_cekaci_doba;
			
			FakeRMI.pocet_rmi++;
		}
		public void run(){
			/*
			Random randomGenerator = new Random();
			String korpus = null;
			String cql = null;
			int korpus_number = 0;
			int cql_number = 0;
			int type_number = 0;
			
			for(int i=0; i<this.pocet_cyklu_rmi; i++){
				try{
					synchronized (this) {
						this.wait(1+randomGenerator.nextInt(this.max_cekaci_doba));
					}
				}
				catch (InterruptedException e) {
					System.out.println(e);
				}
				
				
				korpus_number = randomGenerator.nextInt(this.pocet_korpusu);
				cql_number =  randomGenerator.nextInt(pocet_cql);
				type_number =  randomGenerator.nextInt(pocet_typu_dotazu);
				
				switch(korpus_number){
					case 1:
						korpus = "orw-mte";
						break;
					case 2:
						korpus = "pmk";
						break;
					default:
						korpus = "capek_uplny";
						break;
				}

				switch(cql_number){
					case 1:
						cql = "[word=\"kost\"]";
						break;
					case 2:
						cql = "[word=\"hrad\"]";
						break;
					default:
						cql = "[word=\"pes\"]";
						break;
				}
				
				switch(type_number){
				//case 1:
				//	dotaz = new CollocationQuery(korpus, cql, "word", 'f', 1,1, -5, 5, 2);
				//	break;
				default:
					TestingClientRMI.makeQuery(korpus, cql);
					break;
				}
				
				
			}*/
			
			if(this.pocet_cyklu_rmi<10) this.pocet_cyklu_rmi = 10;
			Date cas = new Date();
			
			for(int i=0; i<(this.pocet_cyklu_rmi/10); i++){

				TestingClientRMI.makeQuery("orw-mte", "[word=\"kost\"]");
				TestingClientRMI.makeQuery("pmk", "[word=\"kost\"]");
				TestingClientRMI.makeQuery("capek_uplny", "[word=\"kost\"]");
				TestingClientRMI.makeQuery("orw-mte", "[word=\"hrad\"]");
				TestingClientRMI.makeQuery("pmk", "[word=\"hrad\"]");
				TestingClientRMI.makeQuery("capek_uplny", "word=\"hrad\"]");
				TestingClientRMI.makeQuery("orw-mte", "[word=\"pes\"]");
				TestingClientRMI.makeQuery("pmk", "[word=\"pes\"]");
				TestingClientRMI.makeQuery("capek_uplny", "[word=\"pes\"]");
				TestingClientRMI.makeQuery("pmk", "[word=\"hrad\"]");
				
			}
			
			Date cas2 = new Date();
			System.out.println(cas.getTime()+" "+cas2.getTime()+" "+(cas2.getTime()-cas.getTime()));
			
		}
	}

	public static void main(String argv[]) {
		try {
			Logging.create("/tmp/");
		} catch (Exception e) {
			System.out.println(e);
			return;
		}

		int pocet_zadanych_argumentu = 0;

		int pocet_rmi = 3;
		int pocet_cyklu_rmi = 10;
				
		int pocet_korpusu = 3;
		int pocet_cql = 3;
		int pocet_typu_dotazu = 2;
		int max_cekaci_doba = 1;
		
		try{

			System.out.print("Spusteno pro: ");

			if(++pocet_zadanych_argumentu < argv.length){
				//pocet korpusu
				if(Integer.parseInt(argv[pocet_zadanych_argumentu-1]) > -1)
					pocet_rmi = Integer.parseInt(argv[pocet_zadanych_argumentu-1]);

				System.out.print(pocet_rmi+"(pocet_rmi) ");
			}

			if(++pocet_zadanych_argumentu < argv.length){
				//pocet korpusu
				if(Integer.parseInt(argv[pocet_zadanych_argumentu-1]) > -1)
					pocet_cyklu_rmi = Integer.parseInt(argv[pocet_zadanych_argumentu-1]);

				System.out.print(pocet_cyklu_rmi+"(pocet_cyklu_rmi) ");
			}

			if(++pocet_zadanych_argumentu < argv.length){
				//pocet korpusu
				if(Integer.parseInt(argv[pocet_zadanych_argumentu-1]) > -1)
					pocet_korpusu = Integer.parseInt(argv[pocet_zadanych_argumentu-1]);

				System.out.print(pocet_korpusu+"(pocet_korpusu) ");
			}

			if(pocet_zadanych_argumentu++ < argv.length){
				//pocet ruznych cql
				if(Integer.parseInt(argv[pocet_zadanych_argumentu-1]) > -1)
					pocet_cql = Integer.parseInt(argv[pocet_zadanych_argumentu-1]);

				System.out.print(pocet_cql+"(pocet_cql) ");
			}

			if(pocet_zadanych_argumentu++ < argv.length){
				//pocet typu dotazu
				if(Integer.parseInt(argv[pocet_zadanych_argumentu-1]) > -1)
					pocet_typu_dotazu = Integer.parseInt(argv[pocet_zadanych_argumentu-1]);

				System.out.print(pocet_typu_dotazu+"(pocet_typu_dotazu) ");
			}

			if(pocet_zadanych_argumentu++ < argv.length){
				//pocet typu dotazu
				if(Integer.parseInt(argv[pocet_zadanych_argumentu-1]) > 0)
					max_cekaci_doba = Integer.parseInt(argv[pocet_zadanych_argumentu-1]);

				System.out.print(max_cekaci_doba+"(max_cekaci_doba) ");
			}
			
			System.out.println(".");
			
			FakeRMI[] vlakna = new FakeRMI[pocet_rmi];
			Thread[] thready = new Thread[pocet_rmi];
			
			for(int i=0; i<vlakna.length; i++){
				vlakna[i] 	= new FakeRMI(pocet_cyklu_rmi,pocet_korpusu,pocet_cql,pocet_typu_dotazu, max_cekaci_doba);
				thready[i] 	= new Thread(vlakna[i]);
				thready[i].start();
			}
		
		}
		catch(NumberFormatException e){
			System.out.println("");
			System.out.println("Spatny format vstupnich cisel. Spoustejte s ciselnymi argumenty: pocet_vlaken_PM pocet_rmi pocet_cyklu_rmi pocet_korpusu pocet_cql pocet_typu_dotazu max_cekaci_doba");
		}
		
	}
	
}
